package Game;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Random;

import javax.swing.JOptionPane;

import TDAMapeo.InvalidKeyException;




/**
 * Clase archivo para manejar el nivel del juego
 */
public class ClaseArchivo {

	protected boolean Cargue=true;

	private String url;
	
	private BufferedReader br;
	private FileReader F;
	
	/**
	 * Constructor de la clase archivo .
	 * @param ruta,que  abre para leer el nivel del juego.
	 */
	public ClaseArchivo (String ruta){
		try {
			F = new FileReader(ruta);	
			br=new BufferedReader(F);
		} catch (FileNotFoundException e){ e.printStackTrace();}
	}

	
	
	/**
	 * Metodo que lee el archivo de texto para cargar el nivel en el juego.
	 * @return true si no hubo problema, false en caso contrario.
	 */
	
public boolean leerMapa(Tablero t,GUI g )
{
	
	  boolean problem=false; 

	try{
		
	   int caract = F.read();
	  int fila=0;
	  int filaMax=0;
	  int columna=0;
	  char anterior = ' ';
	  int x=50;
	  int y=50;
	  Transitable ultimo = null;
	  boolean primFila=true;

	  
	  
	while((caract != -1)&&(!problem))  //mientras no termine el fichero && el mapa sea correcto
	   {
			
			char letra = (char) caract;

			if (letra == '\n') 
				
				 
				{
				  anterior =' ';
				  ultimo=null;
				  if (filaMax<fila) {problem=true;break;}
				  fila=0;
				  columna++;
				  primFila=false;
				  caract = F.read();
				  }
			else
				
			{

				
				if (((Esvalido(letra)))|((int)letra==13))
				{
					

				switch (letra) {
				case 'O': {
					if ((anterior==' ')&&(ultimo==null))
					{
						
						Transitable transitable = new Transitable(anterior);
						transitable.setX(fila*x);
						transitable.setY(columna*y);
						transitable.setRepresentacionG(new RepresentacionGrafica(g.getMapeo().get("pisos"),fila*x,columna*y));
						transitable.getRG().setStar();
						t.agregarTrans(transitable);
						t.getRobot().setPosX(fila*x);
						t.getRobot().setPosY(columna*y);
						break;
						
					}else problem = true;
				
				}
				
				case 'D': { //destino llegada
					if ((anterior=='S')||(anterior=='A'))
					{
						if (ultimo!=null)
						{
							
							Transitable ss = new Transitable(anterior); 
							Premio llegada= new Premio(0,ss,anterior);
							llegada.setX(fila*x);
							llegada.setY(columna*y);
							t.agregarObjeto(llegada);
							RepresentacionGrafica lleg = new RepresentacionGrafica (g.getMapeo().get("objetos"),fila*x,columna*y);
							llegada.setRepresentacionG (lleg);
							lleg.setLlegada();
							ultimo.getRG().setVisible(false);
							lleg.setVisible(true);
							ultimo=null;
							g.setLLegada(llegada);
							break;
						}else problem=true;
						
					}else problem=true;
					
					

				}
				case 'A': {//Asfalto
					if ((anterior==' ')&&(ultimo==null))
					{
						
						Transitable transitable = new Transitable(anterior);
						transitable.setX(fila*x);
						transitable.setY(columna*y);
						transitable.setRepresentacionG(new RepresentacionGrafica(g.getMapeo().get("pisos"),fila*x,columna*y));
						transitable.getRG().setAsfalto();
						t.agregarTrans(transitable);
						ultimo=transitable;
						break;
					}else problem=true;
				
				}
				case 'B': //Baliza sobre piso anterior tiene que ser A o S
					if ((anterior=='S')||(anterior=='A'))
					{
						if (ultimo!=null)
						{
							Coleccionable baliza = new Coleccionable (true);
							baliza.setX(fila*x);
							baliza.setY(columna*y);
							RepresentacionGrafica rg = new RepresentacionGrafica(g.getMapeo().get("objetos"),fila*x,columna*y);
							if ((char)anterior=='S')
								rg.setBalizaArena();
							else rg.setBalizaAsfalto();
							baliza.setRepresentacionG(rg);
							t.agregarColeccionable(baliza);
							baliza.setUbicacion(ultimo);
							ultimo.getRG().setVisible(false);
							rg.setVisible(true);
							ultimo=null;
							break;
						}else problem = true;
						
			
							
					}else problem = true;
					
				case 'C': 	//cono
					
					if ((anterior=='S')||(anterior=='A'))
					{
						if (ultimo!=null)
						{
							Coleccionable cono = new Coleccionable (false);
							cono.setX(fila*x);
							cono.setY(columna*y);
							RepresentacionGrafica rg = new RepresentacionGrafica(g.getMapeo().get("objetos"),fila*x,columna*y);
							if ((char)anterior=='S')
								rg.setConoArena();
							else rg.setConoAsfalto();
							cono.setRepresentacionG(rg);
							cono.setUbicacion(ultimo);
							t.agregarColeccionable(cono);
							ultimo.getRG().setVisible(false);
							rg.setVisible(true);
							ultimo=null;
							break;
						
						}else problem = true;
				
		
						
					}else problem = true;
					
				case 'W': // Agua
				{
					if ((anterior==' ')&&(ultimo==null))
					{
						NoTransitable nt = new NoTransitable();
						nt.setX(fila*x);
						nt.setY(columna*y);
						nt.setRepresentacionG(new RepresentacionGrafica(g.getMapeo().get("pisos"),fila*x,columna*y));
						nt.getRG().setAgua();
						t.agregarPiso(nt);
						break;
					}
					
				}
				case 'F': //Fuego
				{
					if ((anterior==' ')&&(ultimo==null))
					{
						NoTransitable nt = new NoTransitable();
						nt.setX(fila*x);
						nt.setY(columna*y);
						nt.setRepresentacionG(new RepresentacionGrafica(g.getMapeo().get("pisos"),fila*x,columna*y));
						nt.getRG().setFuego();
						t.agregarPiso(nt);
						ultimo=null;
						break;
					}
				}
				case 'S' : {
					if ((anterior==' ')&&(ultimo==null))
					{
						Transitable transitable = new Transitable();
						transitable.setX(fila*x);
						transitable.setY(columna*y);
						transitable.setRepresentacionG(new RepresentacionGrafica(g.getMapeo().get("pisos"),fila*x,columna*y));
						transitable.getRG().setArena();
						t.agregarTrans(transitable);
						ultimo=transitable;
						break;
					}else problem=true;
					
				}
				case 'N' : {
					 
							if ((anterior=='S')||(anterior=='A'))
							{
								if (ultimo!=null)
								{
									//Random r = new Random();
									//int azar = r.nextInt(3);
									Premio cono = new Premio (2,ultimo,anterior);
									cono.setX(fila*x);
									cono.setY(columna*y);
									RepresentacionGrafica rg = new RepresentacionGrafica(g.getMapeo().get("premios"),fila*x,columna*y);
									if ((char)anterior=='S')
										/**
											switch(cono.getTipo()){
											case 0: rg.setBalasArena();
											case 1: rg.setPuntosArena();
											case 2: rg.setCombustibleArena();
											}
										else
											switch(cono.getTipo()){
											case 0: rg.setBalasAsfalto();
											case 1: rg.setPuntosAsfalto();
											case 2: rg.setCombustibleAsfalto();
											}
										*/	
										
											rg.setCombustibleArena();
										else rg.setCombustibleAsfalto();				
										
									cono.setRepresentacionG(rg);
									cono.setUbicacion(ultimo);
									t.agregarPremio(cono);
									ultimo.getRG().setVisible(false);
									rg.setVisible(true);
									ultimo=null;
									break;
								}else problem = true;
						
				
								
							}else problem = true;
							
						 
						
						
				}
				case 'V': 
					//Balas, el caracter fue elegido por mi
					 {
							if ((anterior=='S')||(anterior=='A'))
							{
								if (ultimo!=null)
								{
									//Random r = new Random();
									//int azar = r.nextInt(3);
									Premio cono = new Premio (0,ultimo,anterior);
									cono.setX(fila*x);
									cono.setY(columna*y);
									RepresentacionGrafica rg = new RepresentacionGrafica(g.getMapeo().get("premios"),fila*x,columna*y);
									
									if ((char)anterior=='S')
										/**
											switch(cono.getTipo()){
											case 0: 
											rg.setBalasArena();
											case 1: rg.setPuntosArena();
											case 2: rg.setCombustibleArena();
											}
										else
										switch(cono.getTipo()){
											case 0:
												rg.setBalasAsfalto();
											case 1: rg.setPuntosAsfalto();
											case 2: rg.setCombustibleAsfalto();
											}
										*/
									
										rg.setBalasArena();
									else rg.setBalasAsfalto();
															
										
									cono.setRepresentacionG(rg);
									cono.setUbicacion(ultimo);
									t.agregarPremio(cono);
									ultimo.getRG().setVisible(false);
									rg.setVisible(true);
									ultimo=null;
									break;
								}else problem = true;
								
				
								
							}else problem = true;
						
				}
				case 'P': {
					if ((anterior=='S')||(anterior=='A'))
					{
						if (ultimo!=null)
						{
							//Random r = new Random();
							//int azar = r.nextInt(3);
							Premio premi = new Premio (1,ultimo,anterior);
							premi.setX(fila*x);
							premi.setY(columna*y);
							RepresentacionGrafica rg = new RepresentacionGrafica(g.getMapeo().get("premios"),fila*x,columna*y);
							if ((char)anterior=='S')
								/**
									switch(premi.getTipo()){
									case 0: {
										rg.setBalasArena();
									}
									case 1: {
										rg.setPuntosArena();
									}
									case 2: {
										rg.setCombustibleArena();
									}
									}
								else
									switch(premi.getTipo()){
									case 0: rg.setBalasAsfalto();
									case 1: rg.setPuntosAsfalto();
									case 2: rg.setCombustibleAsfalto();
									}
									*/
								
								
							
									rg.setPuntosArena();
							else	 rg.setPuntosAsfalto();
													
								
							premi.setRepresentacionG(rg);
							premi.setUbicacion(ultimo);
							t.agregarPremio(premi);
							
						
							ultimo.getRG().setVisible(false);
							rg.setVisible(true);
							ultimo=null;
							break;
						}else problem = true;
				
		
						
					}else problem = true;
				}
				case '/': {//pared
					if ((anterior=='S')||(anterior=='A'))
					{
						if (ultimo!=null)
						{
							Pared pared = new Pared(anterior);
							pared.setX(fila*x);
							pared.setY(columna*y);
							t.agregarDestruible(pared);
							RepresentacionGrafica par = new RepresentacionGrafica (g.getMapeo().get("objetos"),fila*x,columna*y);
							pared.setRepresentacionG(par);
							par.setPared();
							par.setVisible(true);
							pared.setUbicacion(ultimo);
							
							if(pared.getPremio()!=null){
								RepresentacionGrafica re;
								try {
									re = new RepresentacionGrafica(g.getMapeo().get("premios"),pared.getX(),pared.getY());
									re.setVisible(false);
									pared.getPremio().setRepresentacionG(re);
									if (pared.getPremio().getPiso()=='S')
										switch(pared.getPremio().getTipo()){
										case 0: re.setBalasArena();
										case 1: re.setPuntosArena();
										case 2: re.setCombustibleArena();
										}
									else{
										switch(pared.getPremio().getTipo()){
										case 0: re.setBalasAsfalto();
										case 1: re.setPuntosAsfalto();
										case 2: re.setCombustibleAsfalto();
										}
									}
									pared.getPremio().setUbicacion(ultimo);
									t.agregarPremio(pared.getPremio());
									
								} catch (InvalidKeyException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
							}
							
							ultimo.getRG().setVisible(false);
							
							break;
						} else problem=true;
						
					}else problem = true;					
				}
				case '*': {//planta
					if ((anterior=='S')||(anterior=='A'))
					{
						if (ultimo!=null)
						{
							Planta planta = new Planta(anterior);
							planta.setX(fila*x);
							planta.setY(columna*y);
							t.agregarDestruible(planta);
							RepresentacionGrafica c = new RepresentacionGrafica (g.getMapeo().get("objetos"),fila*x,columna*y);
							planta.setRepresentacionG(c);
							c.setPlanta();
							planta.setUbicacion(ultimo);
							if(planta.getPremio()!=null){
								RepresentacionGrafica re;
								try {
									re = new RepresentacionGrafica(g.getMapeo().get("premios"),planta.getX(),planta.getY());
									re.setVisible(false);
									planta.getPremio().setRepresentacionG(re);
									if (planta.getPremio().getPiso()=='S')
										switch(planta.getPremio().getTipo()){
										case 0: re.setBalasArena();
										case 1: re.setPuntosArena();
										case 2: re.setCombustibleArena();
										}
									else{
										switch(planta.getPremio().getTipo()){
										case 0: re.setBalasAsfalto();
										case 1: re.setPuntosAsfalto();
										case 2: re.setCombustibleAsfalto();
										}
									}
									planta.getPremio().setUbicacion(ultimo);
									t.agregarPremio(planta.getPremio());
									
								} catch (InvalidKeyException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
							}
							ultimo.getRG().setVisible(false);
							c.setVisible(true);
						
							break;
						} else problem=true;
						
					}else problem = true;
				
				}
				case '+': { //caja
					if ((anterior=='S')||(anterior=='A'))
					{
						if (ultimo!=null)
						{
							Caja caja = new Caja(anterior);
							caja.setX(fila*x);
							caja.setY(columna*y);
							t.agregarDestruible(caja);
							RepresentacionGrafica c = new RepresentacionGrafica (g.getMapeo().get("objetos"),fila*x,columna*y);
							caja.setRepresentacionG (c);
							c.setCaja();
							c.setVisible(true);
							caja.setUbicacion(ultimo);
							if(caja.getPremio()!=null){
								RepresentacionGrafica re;
								try {
									re = new RepresentacionGrafica(g.getMapeo().get("premios"),caja.getX(),caja.getY());
									re.setVisible(false);
									caja.getPremio().setRepresentacionG(re);
									if (caja.getPremio().getPiso()=='S')
										switch(caja.getPremio().getTipo()){
										case 0: re.setBalasArena();
										case 1: re.setPuntosArena();
										case 2: re.setCombustibleArena();
										}
									else{
										switch(caja.getPremio().getTipo()){
										case 0: re.setBalasAsfalto();
										case 1: re.setPuntosAsfalto();
										case 2: re.setCombustibleAsfalto();
										}
									}
									caja.getPremio().setUbicacion(ultimo);
									t.agregarPremio(caja.getPremio());
									
								} catch (InvalidKeyException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
							}
							ultimo.getRG().setVisible(false);
							ultimo=null;
							break;
						}problem = true;
					
					}
					else problem = true;
				}
				case '!': { //concreto
					if ((anterior=='S')||(anterior=='A'))
					{
					if (ultimo!=null)
					{
						Concreto pared = new Concreto();
						pared.setX(fila*x);
						pared.setY(columna*y);
						t.agregarObjeto(pared);
						RepresentacionGrafica par = new RepresentacionGrafica (g.getMapeo().get("objetos"),fila*x,columna*y);
						pared.setRepresentacionG(par);
						par.setConcreto();
						par.setVisible(true);

						pared.setUbicacion(ultimo);
						ultimo.getRG().setVisible(false);
						
						break;
					}
				 }
				}
				case ' ': {
					fila++;
					ultimo=null;

					if (primFila)
					{
						filaMax=fila;
					}
				}
				
			}//fin case
			
				

			
			
			anterior=(char)caract;
		    caract = F.read();


		    
				} else {JOptionPane.showMessageDialog(null,("No se puede cargar este nivel"));
				 			Cargue =false;
							break;
				}
		 }
			//fin else ((char)caract!='\n') 

		
		 
			//fin else ((char)caract!='\n') 

			
	   } // fin while

	
	   F.close();

		if (filaMax!=fila)
		{
			System.out.println("error en cantidad de filas");
			problem=true;
			return !problem;


		}
	   return !problem; 
	   }

	   catch (Exception e)
	   {
	      System.out.println("Error de lectura del fichero");
	   }

	return problem ;
	}



/**
 * Cuenta las filas que tiene el nivel.
 * @return true si el nivel tiene 14 filas, false en caso contrario.
 */
public boolean contarFilas()
{
	boolean correcto=false;
	int i =0;
	try {
	      BufferedReader br = new BufferedReader(F);
	 
	      String linea;
	      while((linea = br.readLine()) != null)
	        i++;
	 
	      F.close();
	      
	    }
	    catch(Exception e) {
	    }
	if (i==14) {correcto=true;}
	
return correcto;	
}	



		
	
/**
 * Cuenta las columnas que tiene el nivel.
 * @return true si el nivel tiene 17 columnas, false en caso contrario.
 */

public boolean ContarColumnas()
{
	boolean correcto=true;
	int i=0;
	try {
		String linea;
	      while(((linea = br.readLine()) != null)&&(correcto))
	      {	  
	      BufferedReader br = new BufferedReader(F);
	      //String linea= br.readLine();
	      char auxiliar [ ] = linea.toCharArray();
	      
	      for (int x = 0 ; x < auxiliar.length-1 ; x++){
	    	  if(linea.charAt(x)==' ') i=i+1;
	    	  
	    	 }
	      if(i!=17) correcto=false;
	      else i=0;
	    }
	      F.close();
	      
	}   
	
	catch (IOException e) {
		
		e.printStackTrace();
		}
	
	
	return correcto;
}

	

protected boolean GetCargue()
{return Cargue;}

/**
 * Se fija si el caracter pasado por paramentro es valido.
 * @return true si el carcter c recibido por parametro es correcto, false en caso contrario.
 * @param c caracter a verificar.
 */
private boolean Esvalido(char c)
{
	return ((c=='!') | (c== '+')| (c== '*') |(c=='A') |(c=='S') |(c=='F')|(c== '/')|(c== 'B')|(c=='\n')| (c=='V') |(c=='C')| (c=='N')|(c== 'W') |(c=='D') |(c=='P') |(c=='O')|(c==' '));
}
	

}
	
	
